package jus.poc.prodcons.v4;

import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.concurrent.Semaphore;
import jus.poc.prodcons.Message;

/**
 * MessageX est une implémentation d'un message quelqonque transmissible.
 *
 * @author Nunes Thomas <nds.thomas@gmail.com>
 * @author Feng Xu <fengxu1989@gmail.com>
 */
public class MessageX implements Message {

	private static int nbMessages = 1;

	private int id;
	private String author;
	private ArrayList<String> consommateurs;
	private Date date;
	private ArrayList<Date> recu;
	private int exemplaires;
	private int origExemplaires;
	private int consommation;
	private int ticket = -1;
	private Semaphore suspension;


	
	public MessageX(String author,int e) {
		id = nbMessages;
		nbMessages++;
		this.author=author;	
		date = new Date(1);
		recu = new ArrayList<Date>();
		consommateurs = new ArrayList<String>();
		exemplaires=e;
		origExemplaires=e;
		suspension = new Semaphore(0);
		consommation = 0;
	}
	
	/**
	 * Fixe la date de creation du message
	 * @param date
	 * La Date a laquelle le message a ete cree
	 */
	public void setDate(Date date) {
		this.date=date;
	}
	/**
	 * Ajoute la date de reception du message pour un consommateur c
	 * @param recu
	 * La Date a laquelle le message a ete re�u
	 * @param c
	 * Le consommateur
	 */
	public void addRecu(String c,Date recu) {
		this.recu.add(recu);
		consommateurs.add(c);
	}
	/**
	 * 
	 * @return
	 * Le nombre d'exemplaires restants
	 */
	public int getExemplaires() {
		return exemplaires;
	}
	
	/**
	 * 
	 * @return
	 * Le nombre d'exemplaires a la creation
	 */
	public int nbExemplaires() {
		return origExemplaires;
	}
	
	/**
	 * Lit un exemplaire (diminue le nombre d'exemplaires restants)
	 */
	public void exemplaireLu() {
		exemplaires--;
	}

	/**
	 * 
	 * @return
	 * Le ticket du message
	 */
	public int getTicket() {
		return ticket;
	}

	/**
	 * Definit le ticket du message
	 * @param ticket
	 * le ticket
	 */
	public void setTicket(int ticket) {
		this.ticket = ticket;
	}
	
	/**
	 * Suspend les thread qui sont lies au message, le temps que tous les exemplaires soient retires
	 * @throws InterruptedException
	 */
	public void suspensionAcquire() throws InterruptedException {
		suspension.acquire();
	}
	
	/**
	 * Libere les thread bloques dans le message
	 */
	public void suspensionRelease() {
		suspension.release(origExemplaires+1);
	}
	
	/**
	 * Augmente le nombre d'exemplaires consomm�s
	 */
	public void exemplaireConsomme() {
		consommation++;
	}
	
	/**
	 * 
	 * @return
	 * Vrai si tous les exemplaires ont ete consommes
	 */
	public boolean estConsomme() {
		return consommation==origExemplaires;
	}
	

	@Override
	public String toString() {
		SimpleDateFormat formatDate = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss:SSS");
		String s = id()+" envoye "+formatDate.format(date)+", de : "+author+", traite par par ";
		if (consommateurs.isEmpty()) {
                    s+="<PERSONNE>";
                }
		else {
                    for (int i = 0; i < consommateurs.size(); i++) {
                            if(i!=0) {
                                s+=" ----> ";
                            }
                            s+=consommateurs.get(i);
                            s+=" le ";
                            s+=formatDate.format(recu.get(i));
                    }
                }
		return s;
	}
	
	public String id() {
		return  "Message"+id;
	}
	
	
	
	
	
	
}
